世界上沒有確定的事,這是我唯一確定的 --《A Beautiful Mind》
簡單介紹後端程式大致可以分為三層架構,每個層都有自己的職責,降低層與層之間的依賴,並不是將程式碼寫在同一個地方。
- 介面層: 負責接收前端的請求,並請業務邏輯層處理,再回傳資料給前端; 也可以為View層,渲染使用者視圖。
- 業務邏輯層:被表示層呼叫,根據請求做資料處理或是處理從DAO回來的資料。
- 資料訪問層:對資料庫做增修查改等操作。
(1)新增一個service TodoService.java
請求資料後,並處理資料。
import com.caili.todolist.entity.Todo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class TodoService {
@Autowired
TodoDao todoDao; // 取得Dao物件
public Iterable<Todo> getTodos () {
return todoDao.findAll();
}
}
(2)在TodoService
類別上方下 @Service
標註,此為業務邏輯層,可以將業務邏輯的程式碼撰寫在這裡,
(3) 標註@Autowired
可以讓Spring自動把屬性需要的對象從Spring容器找出来,並注入给該屬性,在這裡將TodoDao
注入在此。
(4)最後,創建一個getTodos
方法,利用上一篇創建的todoDao
DAO物件繼承CrudRepository介面
,透過物件操作findAll()
方法,取回資料庫ToDo的所有資料,在這裡可以對從dao回傳的資料做處理,但這個範例是將取得的Iterable物件直接回傳,而CrudRepository文件 也提供許多操作資料庫的方法,如findById()
、save()
等。
上一篇創建的dao與剛剛service層,就要來處理前端網頁端發送出來的請求了,接著要建立controller層。
(1)新增一個service TodoController.java
處理來自web的請求
(2)在類別上方標註下@RestController
聲明此類別RESTful Web服務。
(3)透過@Autowired
注入TodoService,取得service層的物件。
(4)創建一個方法,並用@GetMapping("/todos")
標註接收HTTP請求[ GET] /todos
對映到getTodoList
這個方法,利用todoService物件取得所有資料並回應請求。
以下用@RestController
創造一個[GET/todos
的Rest API
呼叫TodoService的getTodos()方法取得所有資料並返回請求,默認為JSON格式。
import com.caili.todolist.entity.Todo;
import com.caili.todolist.service.TodoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TodoController {
@Autowired
TodoService todoService;//取得Service物件
@GetMapping("/todos")
public Iterable<Todo> getTodoList () {
Iterable<Todo> todoList = todoService.getTodos();
return todoList;
}
}
我們實際來測試看看,由於之前建立todolist的資料庫我們一開始沒有預設沒有任何的資料,現在我們要手動將資料insert進去。
(1)將application啟動 ./mvnw spring-boot:run
(2)接著,進入http://localhost:9100/h2-console/
點擊Connect 連接資料庫GUI介面。(註:我們在application.yml 設定port為9100)
(3) 在SQL Statement 區撰寫SQL指令,插入多筆資料。
(4) 因為我們已經插入多筆資料了,接著去http://localhost:9100/todos
查看,可以看到我們剛剛鍵入所有todos的資料。這樣就完成了一個HTTP GET API了,從Controller -> Service -> DAO -> DB 串接。
最近在研究Golang的Clean Architecture,裡面介紹到了很多DI的概念,原來Spring boot也是這樣一層一層的注入的,真是長知識了~
阿~我也長知識了~開心